package study.JavaBase;

/**
 * date:2025.11.4
 * author:fzy
 * title:java内部类
 */

/*
内部类：就是类中又定义了一个被类
访问特点：内部类可以直接访问外部类的成员，包括私有
外部类要访问内部类的成员，必须创建对象
 */
public class Java_26 {
    //通过外部类实例内部类对象
    public static void main(String[] arg){
//        Outer.Inner oi = new Outer().new Inner();
//        oi.show();
        Outer out  = new Outer();
        out.show();
        Outer_2 out2 = new Outer_2();
        out2.method();
        AnonymousClass anonymousClass = new AnonymousClass();
        anonymousClass.method();
        JumpDemo jumpDemo  = new JumpDemo();
        JumppingOperator jumppingOperator = new JumppingOperator();
        jumppingOperator.method(jumpDemo.getJumpInter());

    }
}

//成员内部类
class Outer {
    private final int num = 10;
    //成员内部类,不能在外部直接实例内部类
    private class Inner{
        public void show(){
            //内部类可以直接访问外部类的成员变量
            System.out.println("成员内部类"+num);
        }
    }
    //外部类不能直接访问内部类的成员变量方法，必须获取实例
    public void show(){
        Inner in = new Inner();
        in.show();
    }

}

//局部内部类
class Outer_2{
    private int num = 10;
    public void method(){
        class Inner{
            void show(){
                System.out.println("局部内部类"+num);
            }
        }
        Inner in = new Inner();
        in.show();
    }
}

//匿名内部类
//存在一个类或者接口（具体类|接口）
//继承了该类或者实现了接口的子类对象

 interface Inter{
    void show();
}

class AnonymousClass{
    private int num = 10;
    public void method(){
        //单次调用
//        new Inter(){
//            @Override
//            public void show() {
//                System.out.println("匿名内部类"+num);
//            }
//        }.show();
        //多次调用
        Inter  i = new Inter() {
            @Override
            public void show() {
                System.out.println("匿名内部类"+num);
            }
        };
        i.show();
    }
}
//案例
interface Jumpping{
    void jump();
}


class JumppingOperator{
    void method(Jumpping j){
        j.jump();
    }
}

class JumpDemo{
    Jumpping getJumpInter(){
        return new Jumpping() {
            @Override
            public void jump() {
                System.out.println("jump!!!!");
            }
        };
    }
}
